from flask import Blueprint, request, jsonify  
# Blueprint: 蓝图，用来给路由分组
# request:   用来接收前端发来的数据（比如用户填的账号密码）
# jsonify:   用来把 Python 字典转换成 JSON 格式发回给前端

from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity
# create_access_token: 制造入场券
# jwt_required:        查票（装饰器）
# get_jwt_identity:    看票上写的名字是谁

from models import db, User  # 导入数据库工具和用户模型

# 2. 创建蓝图 给这一组路由起个名字叫 'auth'
auth_bp = Blueprint('auth', __name__)

# @auth_bp.route: 定义路标。
@auth_bp.route('/register', methods=['POST'])
def register():
    data = request.get_json()
    # 从数据里提取用户名和密码
    username = data.get('username')
    password = data.get('password')
    if User.query.filter_by(username=username).first():
        # 如果搜到了，说明重名了，返回错误信息，400 是状态码（客户端错误）
        return jsonify({"msg": "用户名已存在"}), 400

    # 如果没重名，创建一个新的 User 对象（还没存进数据库，只是在内存里）
    new_user = User(username=username, password=password)
    
    # 把这个新用户放到“待提交区”
    db.session.add(new_user)
    # 写入数据库文件
    db.session.commit()

    # 返回成功信息，201 表示“创建成功”
    return jsonify({"msg": "注册成功"}), 201

# ================= 登录窗口 =================
@auth_bp.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')

    # 去数据库里找这个用户名的人
    user = User.query.filter_by(username=username).first()

    # 验证环节：
    # 1. user 必须存在 (不是 None)
    # 2. user.password (数据库里的密码) 必须等于 password (前端传来的密码)
    if user and user.password == password:
        # 如果通过验证，创建一个 Token (入场券)
        # identity=username: 把用户名写在 Token 里，证明这张票是给谁的
        access_token = create_access_token(identity=username)
        
        # 把 Token 和用户信息一起返回给前端
        # 200 表示“一切正常”
        return jsonify(access_token=access_token, user=user.to_json()), 200
    
    return jsonify({"msg": "用户名或密码错误"}), 401

# ================= VIP 专属窗口 (受保护) =================
@auth_bp.route('/protected', methods=['GET'])
@jwt_required()  # 这个装饰器就是“保安”
# 它的作用：在执行下面的 protected 函数之前，先检查请求头里有没有合法的 Token。
# 如果没有 Token 或者 Token 是假的/过期的，直接拦截，返回 401，下面的代码根本不会执行。
def protected():

    # get_jwt_identity(): 读取 Token 里存的信息（就是登录时存的 username）
    current_user = get_jwt_identity()
    
    # 返回一些机密数据，并打个招呼
    return jsonify({
        "msg": f"你好, {current_user}! 你已成功访问受保护的数据。",
        "secret_data": "这里是数据库里的机密数据..."
    }), 200